第 2 章 从 R Markdown 到 HTML 文档

您所在的位置:网站首页 print 语言怎么转换 第 2 章 从 R Markdown 到 HTML 文档

第 2 章 从 R Markdown 到 HTML 文档

2024-07-02 15:03| 来源: 网络整理| 查看: 265

2.4 组件和内容 2.4.1 理解 HTML 文档的依赖关系

前面已经提过,R Markdown 输出的 HTML 文档时,依赖于软件包提供的 HTML 模板。 实际上,HTML 文档的样式和功能很大程度上依赖于一些 CSS 样式和 JavaScript 库的支持。 这里面包括 Bootstrap,JQuery 等优秀的开源项目。

默认情况下,R Markdown 输出的 HTML 文档是一个单一的 .html 文件。这是由 self_contained: true 控制的。.html 文件中,会使用 data: 存储包括 JavaScript、CSS、图片和视频在内的全部资料。这样的一个封装,使得用户可以像分享 PDF 或 Word 文档那样分享文件,同时享受超链接、动态效果等一系列 HTML 特性。

如果你指定 self_contained: false,那么 HTML 文档将会将自身的依赖文件单独存放。

--- title: "Habits" output: html_document: self_contained: false ---

默认情况下,在 .html 文件同一目录会生成同名的 _files 文件夹,存放相应的依赖文件。下面是默认情况下一份 HTML 文档所包含的依赖文件。

+---anchor-sections-1.0 +---bootstrap-3.3.5 | +---css | | \---fonts | +---fonts | +---js | \---shim +---header-attrs-2.5 +---highlightjs-9.12.0 +---jquery-1.11.3 \---navigation-1.1

库文件夹的位置可以由 lib_dir: xxx 指定,例如:

--- title: "Habits" output: html_document: self_contained: false lib_dir: libs ---

依赖文件的内容会随配置变化,例如当在 YAML 配置中加入 df_print: paged 之后,依赖文件中会多一个 pagedtable-1.1 的子文件夹出来。

显然,存放依赖的子文件夹依据 库名 + 版本号 的规则命名。要弄清楚库文件的全部特性,可能要对库本身有相当的理解才行。而 R Markdown 则是把最常用的功能整合提供给了我们。

当文档的内容比较少,同时又有多个类似的文档的时候,库文件所占的存储空间可能比你自己编写的内容还要大得多。这种情况下,将库文件统一存储在指定的 libs 文件夹,可以实现库文件公用。

另外,有些库文件不常用,或者文件太大,还可以通过库文件的服务器调用。例如下面要讲的 MathJax 库。

2.4.2 MathJax 库的配置

HTML 文档需要 MathJax 脚本来渲染 Latex 和 MathML 公式,调用 MathJax 的方式则可以通过 mathjax 参数来调整。

"default":默认配置,会通过 HTTPS 链接从 RStudio 的 CDN 网络服务器上调用;

"local":与 self_contained: false 联合使用时,会将 MathJax 库文件保存在本地目录中;

设置一个 URL 链接,指向可用的 MathJax 库文件地址;

null:完全不使用 MathJax。

例如,使用 MathJax 的本地拷贝可以如下配置:

--- title: "Habits" output: html_document: mathjax: local self_contained: false ---

为 MathJax 配置一个新的可用来源。

--- title: "Habits" output: html_document: mathjax: "http://example.com/MathJax.js" ---

不使用 MathJax。

--- title: "Habits" output: html_document: mathjax: null --- 2.4.3 是否保留 Markdown

knitr 处理 R Markdown 文件时,会先生成一个 Markdown 文件(*.md),随后再由 Pandoc 转换成 HTML 文档。如果需要保留这个 Markdown 文件,可以使用 keep_md 选项。

--- title: "Habits" output: html_document: keep_md: true --- 2.4.4 使用自定义的 HTML 模板

使用 template 选项,可以配置 Pandoc 转换时使用的模板。

--- title: "Habits" output: html_document: template: another_template.html ---

Pandoc 模板遵循特定的格式,有关的进一步信息可以在 Pandoc 模板 页面获得。

下面是一个 HTML 模板的示例:

$title$ $for(css)$ $endfor$ $body$

这其中包括一些变量,如 $title$,$body$ 等。这些变量由 Pandoc 定义,完整的变量列表参见这里。

这样的 HTML 模板使得高度定制化的输出成为可能。例如,你可以在 区域加入任意的 CSS 样式, JavaScript 代码,以及其它的开源库。 另外,还可以定义一些新变量来控制文档的格式化。例如,定义一个布尔值 draft 来确定文档是一个草稿还是最终版本。

.logo { float: right; } $if(draft)$ $else$ $endif$ $body$

draft 在 YAML 元数据中赋值。

--- title: "An Important Report" draft: true output: html_document: template: my-template.html ---

说明:rmarkdown 软件包默认使用自带的 HTML 模板,一些方面与 Pandoc 默认的模板存在差异。如果有 template: null 的话,则 Pandoc 的模板会被使用。

2.4.5 包含其它文件

使用 includes 选项,可以在 HTML 文档的不同位置嵌入其它的 HTML 格式内容。可选的位置包括在 HTML 文档的 header、body 前/后等。

--- title: "Habits" output: html_document: includes: in_header: header.html before_body: doc_prefix.html after_body: doc_suffix.html ---

这种方式可以很方便的为文档加入一些第三方功能和公用的元件。例如在 in_header 中导入预定义的 CSS 样式表和 Javascript 脚本,在 before_body 中加入导航栏,在 after_body 中加入一个底栏等。

下面的例子中,即添加了一个简单的底栏。将其中内容保存到一个 HTML 文件中,放在 after_body 后面即可。

Copyright © R Markdown 指南 2021

除了以上几种常用的位置,你还可以在任意地方插入 HTML 内容。实现这一功能的途径至少有两种。

一是使用 htmltools::includeHTML() 方法:

```{r, echo=FALSE, results='asis'} htmltools::includeHTML('file.html') ```

二是使用 xfun::file_string() 方法:

```{r, echo=FALSE, results='asis'} xfun::file_string('file.html') ```

需要注意的是,导入的 HTML 文件必须是 HTML 片段,而不能是一个完整的 HTML 文档。完整的 HTML 文件中有 标签,解析时会造成错误。比如下面就是一个无效的例子:

Parent HTML file. Child HTML file. 2.4.6 生成 HTML 片段

HTML 片段是一个不完整的 HTML 文件,这种片段适合用于嵌入其它的网页或者内容管理系统(如博客)中。HTML 片段也不自带主题和代码高亮,而通过继承的方式使用其嵌入文件或系统的设置。这样的 HTML 片段,也非常适合用于包含在其它文件中(参见 2.4.5)。

--- output: html_fragment ---

下面是一个 HTML 片段的例子:

HTML 片段可以有标题和代码区域,但是不包含任何 CSS 定义。

head(mtcars) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

将这些内容保存为一个 HTML 文件,导入此处,则效果如下所示:

HTML 片段可以有标题和代码区域,但是不包含任何 CSS 定义。

head(mtcars) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

HTML 片段的内容到此结束。

2.4.7 使用自定义的浏览器图标

通过在 in_header 部位导入 HTML 内容,可以为 HTML 文档设定一个自定义的浏览器图标。

将下面的内容保存到一个名为 header.html 的文档中。

然后通过 includes 导入文件的内容,则可以改变浏览当前文档时的浏览器图标。

output: html_document: includes: in_header: header.html 2.4.8 共用 YAML 配置文件

当前目录中的 _output.yml 文件是一个配置文件,其中的设置可以被目录下所有的 R Markdown 文档公用。需要注意的是,该文件中的内容不需要使用--- 和 output 标签。

如下所示:

html_document: self_contained: false theme: united highlight: textmate

而不应该写成下面这种样子:

--- output: html_document: self_contained: false theme: united highlight: textmate --- 2.4.9 嵌入 Rmd 源文件

当你分享一个 R Markdown 生成的 HTML 文档给他人的时候,对方可能还想找你索取 .Rmd 源文件。在头文件中配置 code_download 参数可以在 HTML 文档中嵌入源文件。

output: html_document: code_download: true

打开 code_download 选项后,页面中会出现一个下载按钮,点击下载按钮即可获得源文件。

2.4.10 嵌入其它文件

嵌入 .Rmd 源文件可能还不足以重现 R Markdown 中结果,通常还会需要原始数据等其它内容。要将这些内容嵌入 HTML 文档中,也是很容易实现的。

这一功能通过 xfun 软件包(R-xfun?) 实现,依赖于 htmltools 和 mime 软件包。要使用这一功能,首先确保这两个软件包可用。

xfun::pkg_load2(c('htmltools', 'mime'))

现在,就可以随意嵌入各种文件了。

```{r echo=FALSE} # 不但可以嵌入一个文件 xfun::embed_file('source.Rmd') # 还可以嵌入多个文件 xfun::embed_files(c('source.Rmd', 'data.csv')) # 甚至一个目录也不在话下 xfun::embed_dir('data/', text = 'Download full data') ```

不仅如此,你还可以编程技巧嵌入所需的文件。

# 嵌入当前目录下所有的 Rmd 和 csv 文件 xfun::embed_files(list.files('.', '[.](Rmd|csv)$'))

说明:当嵌入多个文件时,其工作原理是:首先将这些文件压缩成 Zip 格式,然后将 Zip 文件嵌入到 HTML 文档中。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3